在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
shell还是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。
Shell是一种具备特殊功能的程序, 它是介于使用者和 UNIX/linux 操作系统之核心程序(kernel)间的一个接口。为什么我们说shell是一种介于系统核心程序与使用者间的中介者呢?操作系统是一个系统资源的管理者与分配者,当你有需求时,你得向系统提出;从操作系统的角度来看,它也必须防止使用者因为错误的操作而造成系统的伤害。众所周知,对计算机下命令得透过命令(command) 或是程序(program);程序有编译器(compiler)将程序转为二进制代码,可是命令呢——通过shell传递。其实shell 也是一支程序,它由输入设备读取命令,再将其转为计算机可以运行的机器码,然后执行它。
各种操作系统都有它自己的 shell。以 DOS 为例,它的shell就是command.com文件。如同 DOS 下有 NDOS,4DOS,DRDOS 等不同的命令解译程序可以取代标准的command.com 。UNIX 下除了 Bourne shell(/bin/sh)外还有 C shell(/bin/csh)、Korn shell(/bin/ksh)、Bourne again shell(/bin/bash)、Tenex C shell(tcsh)等其它的 shell。UNIX/linux将 shell 独立于核心程序之外, 使得它就如同一般的应用程序, 可以在不影响操作系统本身的情况下进行修改、更新版本或是添加新的功能。
有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。
当shell接收到用户指令时,首先检查命令是否是内部命令,若不是再检查是否是一个 应用程序 [1] 。然后shell在 搜索路径 [2] 里寻找这些应用程序。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。
shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。
当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值,对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。
当我们进入一个shell时,首先出现的是一行命令提示符,看起来就像这样
concefly@ConceflyXBT:~$ ▋
命令提示符的样式因系统配置不同而不同。大多数Linux系统的命令行提示符样式遵循“用户名@主机名:当前目录 权限”的格式。因此,在我们举例的这个shell中,用户名是concefly,主机名是ConceflyXBT,当前目录是 ~ [3] ,用户权限为普通权限。
光标下,我们能输入指令。shell的指令非常多,每一个都去学习是不现实的,一般掌握一些重要的,了解大多数常用的指令即可。
我们来看一个shell最重要的指令———— cd 当前工作路径切换。
名称:cd
使用对象:所有使用者
命令格式:cd [dirName] (cd和目录之间使用空格隔开)
作用:切换当前目录至dirName。
- 小技巧:
- cd 不带任何参数 或 cd ~,进入用户主目录
- cd - 回到上次的目录
- cd .. 返回上层目录
- cd ../.. 返回上两层目录
Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,毕竟它使用了Linux/Unix下的命令。 shell和shell脚本有什么区别?确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言(就是你所说的shell脚本)。作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。
更明白地来说,shell脚本就像早期dos年代的.bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell脚本更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。
我们来看一个简单的shell脚本是怎么样的
#!/bin/sh
a="hello world"
echo "A is:"
echo $a
程序必须以下面的行开始(必须放在文件的第一行)
#!/bin/sh
符号 #! 用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用 /bin/sh 这个shell来执行程序。当编辑好脚本时,系统默认脚本只是个普通的文本文件。如果要执行该脚本,还必须添加可执行文件属性
$ chmod +x filename
然后,您可以通过输入以下来执行这个的脚本。
$ ./filename
脚注
| [1] | 这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs |
| [2] | 一个能找到可执行程序的目录列表,保存在shell的环境变量PATH内 |
| [3] | shell中 ~ 指代家目录。即 /home/YOUR_HOME |